ASP NET - Limite de Variáveis
Porque o limite de variáveis é relevante ?
Se você trabalha com outras linguagens sabe quanto é importante escolher a variável correta
para armazenar a informação que deseja.
Caso escolha o tipo errado pode dar, de cara, erro de compilação. Se sua ferramenta trata essa
'conversão' automaticamente para você saiba que isto tem um custo e está sujeito a interpretações
e arredondamentos fazendo com que o resultado obtido não seja o esperado. Por exemplo, 5 + 5
em asp net é 10 mas em javscript é 55, logicamente, dependendo do tipo da variável e da situação
que a operação está sendo empregrada
O .NET ( bem como o ASP.NET ) utiliza variáveis fortemente tipadas, ou seja, armazenam um tipo
específico ou uma categoria definida de dado. Por exemplo, se a variável é inteira e você fizer
variavel inteira = 12 / 5 o resultado será 2 e mais nada, o resto vai pra cacha prego.
Se você conhecem bem SQL sabe que não deve usar variáveis tipo float para armazenar dinheiro.
Isso se dá ao fato que as variáveis são feitas para armazenar quantias absurdas como distancias
estrelares e um erro e um metro não é de longe significativo. Portanto se quiser armazenar dinheiro
em variáveis e quiser que os centavos batam você precisa usar o tipo decimal no SQL e ainda
há funções que permitem arredondar o resultado da operacção para cima ou para baixo dependendo
da finalidade da operação.
Vantagens de usar um tipo ou outro tipo
Quanto menor o tipo mais rápido, simples e eficiente será a execução da operação, mas o risco de
estouro é grande. Um tipo muito grande de dado numérico exige que a operação seja feita no núcleo
matemático do processador ( acredite ou não mas antigamente era um chip separado do processador
chamado co-processador aritimético ). Contudo, mesmo assim representa um custo maior que um tipo
menor de dado.
Limite das Variáveis ASP NET
Nome do tipo .NET |
Nome no VB |
Nome no C# |
Range |
Byte |
Byte |
byte |
Armazena números Inteiros de 0 a 255, um byte sem sinal. |
Int16 |
Short |
short |
Armazena números Inteiros de −32.768 a 32.767 - 15 bits + 1 de sinal |
Int32 |
Integer |
int |
Armazena números Inteiros de −2.147.483.648 a 2.147.483.647 |
Int64 |
Long |
long |
Armazena números Inteiros de −9.2E18 a 9.2E18 (Valor aproximado) |
Single |
Single |
float |
É um tipo chamado Ponto flutuante de precisão simples e pode armazenar de −3.4e38 a
3.4E38 (para números grandes) ou −1.5E-45 a 1.5E-45 (para números fracionários pequenos-aproximado).
(*3)
|
Double |
Double |
double |
Chamado de Ponto flutuante de precisão dupla pode armazenar de −1.8E308 a 1.8E308
(para numeros grandes) ou −5.0E-324 a 5.0E-324 (para números fracionários pequenos-aproximado).
(*3)
|
Decimal |
Decimal |
decimal |
Armazena Números inteiros com 128 bits ou 16 bytes e representam uma potência de 10. Podemos armazenar
um número nos limites de +/-79.228.162.514.264.337.593,543.950.335 ou
+/-7.9228162514264337593543950335E+28. (*3)
|
Char |
Char |
char |
Um caractere (*4) Unicode (*2). Ocupa 2 bytes ou 16 bits |
String |
String |
string |
Uma variável de tamanho variável que contém um conjunto de caracteres (*4) Unicode (*2) |
Boolean |
Boolean |
bool |
Armazena um valor binário (*5) verdadeiro(True) ou falso(False) |
DateTime |
Date |
(*1) |
Representa uma data e horário (*6) de 12:00:00 AM de Janeiro do ano 1 no calendário Gregoriano,
até 31 de Dezembro de 9999 às 11:59:59 PM. Os valores de tempo são medidos em 100 de nano-segundos.
Internamente, este tipo de dado é armazendo como um inteiro de 64 bits.
|
TimeSpan |
(*1) |
(*1) |
Representa o período de tempo com um número inteiro, como 10 segundos ou 3 dias mas contando
1 a cada 100 nanosegundos passados.
O menor valor possível é 1 tick (100 nanosegundos) mas nada que você irá processar usará faixas
tão pequenas de tempo da ordem de nanosegundos. É usado para calculo do período de tempo com
grande precisão.
|
Object |
Object |
object |
Pode conter qualquer tipo de objeto do .NET. Por exemplo, um array ou uma structure
é um objeto complexo do .NET que foi adaptado/criado para representar variáveis de qualquer
espécie que o usuário possa precisar ou criar.
Digamos que o tipo coringa de dados, pode armazenar qualquer coisa dentro do .NET mas é
diferente do tipo Variant de antigamente ou do Excel por exemplo. O objeto é sempre uma
estrutura que armazena valores / dados, propriedades, características, etc.
|
Notas: |
*1 - A linguagem não tem um alias para este tipo de variável (timespan).
Por esse motivo usamos o termo timespan nativo .NET para este tipo de variável.
|
*2 - Um caractere UNICODE ocupa 2 bytes de memória e com isso conseguimos representar
praticamente qualquer caractere de qualquer idioma com este tipo de dados. É o companheiro
ideal para o Unicode - UTF-8.
|
*3 - Este é um tipo de dados que podemos chamar de 'astronomico' e não deve ser usado para
armazenar dinheiro porque há erros de arredondamento nas operações. Um erro de 1 metro um ano luz
não é significativo mas um centavo numa soma de 100 itens pode causar uma briga.
|
*4 - Um caractere pode ser uma letra ou um número ou um símbolo em qualquer idioma.
|
*5 - Binário é um tipo de variável de um bit que armazena dois valores possíveis 0 ou 1 e em
implementações do C ou C++ isto é verdade, mas no .NET a variável binária ocupa um byte ( 8 bits )
e é associada aos valores falso ou verdadeiro.
|
*6 - A Data é uma das maldições do SQL ou .NET. Apesar do valor ser armazenado sempre da mesma
maneira na memória, banco de dados, etc a sua exibição depende do idioma escolhido ara exibir a
data. Sendo assim se for Brasil seria DD/MM/YYYY mas se fosse americano/inglês seria
MM/DD/AAAA e se fosse universal seria YYYY-MM-DD. Não se esqueça que, por exemplo, o ano no Japão
é contado a partir da posse do imperador, nos paises muçulmanos e orientais não usam o calendário
Juliano e, sendo assim, o dia x aqui tem que ser convertido no dia y do ano de lá.
|
Uma visão mais detalhada das variáveis
Tipo Variável VB |
Tipo na Common language runtime |
Tipo no VB |
Alocação / Uso da memória |
Range de Valores |
Boolean |
Boolean |
Logica |
Depende da plataforma que foi implementada. Mais comum 1 byte. |
Verdadeiro(True) ou False(false) |
Byte |
Byte |
Numerica Inteiro |
1 byte |
de 0 atpe 255 (sem sinal) |
Byte com sinal |
SByte |
Numerica Inteira |
1 byte |
de -128 a +127 |
Char(caractere simples) |
Char |
Char |
2 bytes |
de 0 até 65535 (sem sinal) |
Data |
DateTime |
Datetime |
8 bytes |
0:00:00 (meia noite) de Primeiro de Janeiro de 0001 até 23:59:59 de 31 de Dezember de 9999 |
Decimal |
Decimal |
Numerico-Inteiro |
16 bytes |
0 a +/-79,228,162,514,264,337,593,543,950,335 (+/-7.9...E+28) sem o ponto decimal.
0 a +/-7.9228162514264337593543950335 com 28 casas de precisão;
O menor número acima de zero é +/- 0.0000000000000000000000000001 (+/-1E-28).
|
Double(Ponto Flutuante de dupla-precision)
|
Double |
Numerico |
8 bytes |
de -1.79769313486231570E+308 a -4.94065645841246544E-324 para valores negativos
de 4.94065645841246544E-324 a 1.79769313486231570E+308 para valores positivos.
|
Integer |
Int32 |
Numeric |
4 bytes |
de -2,147,483,648 a 2,147,483,647 (com sinal) |
Integer sem sinal |
UInteger |
Numeric |
4 bytes |
Núemros Positivos integer entre 0 to 4.294.967.295 |
Long(inteiro long) |
Int64 |
Numerico inteiro |
8 bytes |
de -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 (9.2...E+18 †) (com sinal)
|
Object |
Object (class) |
- |
4 bytes nas plataformas de 32-bit platform 8 bytes nas plataformas de 64-bits |
Qualquer tipo pode ser armazenado dentro de uma variável tipo Objeto |
SByte - byte com sinal |
SByte |
Numeric |
1 byte |
de -128 a 127 (com sinal) |
Short(inteiro curto) |
Int16 |
Numerica inteira |
2 bytes |
de -32,768 a 32,767 (com sinal) |
Inteiro curto sem sinal |
UShort |
Numerica inteira |
2 bytes |
Representa um número Positivo intero de 0 to 65.535 |
Single(Ponto Flutuante de simples-precisão)
|
Single |
Numerica |
4 bytes |
de -3.4028235E+38 a -1.401298E-45 † para valores negativos
de 1.401298E-45 through 3.4028235E+38 para valores positivos.
|
String(variável de tamanho variável)
|
String (class) |
String |
Dependes da implementação na platforma |
0 até aproximadamente 2 bilhões de caracteres Unicode (*7) |
UInteger-Inteiro sem sinal |
UInt32 |
Numerica inteiro |
4 bytes |
de 0 a 4,294,967,295 (sem sinal) |
ULong-Longo sem sinal |
UInt64 |
Numerica inteira |
8 bytes |
de 0 a 18,446,744,073,709,551,615 (1.8...E+19 ) (sem sinal) |
User-Defined (estrutura) |
(inherits from ValueType) |
- |
Depende da implementação na plataforma |
Cada membro da estrutura tem um faixa de valores determinada pelo seu tipo primitivo
independentemente de quantos itens sejam.
|
UShort - Inteiro curto sem sinal |
UInt16 |
Numeric |
2 bytes |
de 0 a65,535 (sem sinal) |
Notas: |
As variáveis numéricas com o simbolo E em sua faixa de valores foram
escritas no formato de notação cientifica e "E" refere-se a potência de 10.
Portantoo 3.56E+2 significa 3.56 x 102 ou 356 , e 3.56E-2 significa 3.56 / 102
ou 0,0356.
|
Caracteres que definem os tipos das variáveis ( uso antigo )
Caractere de tipo |
Descrição( Converte o valor para ) |
Exemplo |
C |
Char |
Dim ch As String = "A"C |
D or @ |
Decimal |
Dim price As Decimal = 12.99D |
R or # |
Double |
Dim pi As Double = 3.14R |
I or % |
Integer |
Dim count As Integer = 99I |
L or & |
Long |
Dim distance As Long = 1999L |
S |
Short |
Dim age As Short = 15 |
F or ! |
Single |
Dim velocity As Single = 74.99F |
Tipos Complexos
Classes: Este é o tipo mais comum no .NET Framework. Strings e arrays são
dois exemplos de classes .NET, embora você possa facilmente criar seu próprio.
Structures ou estruturas : Estruturas, como classes, podem incluir campos, propriedades, métodos e eventos.
Ao contrário das classes, eles são tipos de valor, o que altera a maneira como eles se comportam
com a atribuição e operações de comparação. As estruturas também carecem de algumas das classes
mais avançadas características (como herança) e são geralmente mais simples e menores. inteiros, datas,
e personagens são todas estruturas.
Enumerations ou enumeradores : Uma enumeração define um conjunto de constantes inteiras que
identificam uma sequencia com nomes, um alias para os nomes.
Delegates: O delegade é um ponteiro de método que permite invocar um método
indiretamente. Os delegades são a base para a manipulação de eventos .NET.
Interfaces ou interface : Eles definem um escopo de um objeto ( como parâmetros )
mas ao invés de definir o elemento eles informam que são externos, que serão definidos mais
tarde por outro elemento na fase de compilação do progrma.
Common Reference and Value Types
|
Data Type |
Nature |
Behavior |
Int32,Decimal, Single, Double, and all other basic numeric types |
Value Type |
Equality and assignment operations work with the variable contents, not a reference. |
DateTime, TimeSpan |
Value Type |
Equality and assignment operations work with the variable contents, not a reference. |
Char, Byte, and Boolean |
Value Type |
Equality and assignment operations work with the variable contents, not a reference. |
String |
Reference Type |
Equality and assignment operations appear to work with the variable contents, not a reference. |
Array |
Reference Type |
Equality and assignment operations work with the reference, not the contents. |